iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 25
2
Google Developers Machine Learning

30天鍊成機器學習系列 第 25

TensorFlow 優化器種類及其用法

  • 分享至 

  • xImage
  •  

前言

按照損失函數的負梯度成比例地對系數(W 和 b)進行更新。根據訓練樣本的大小,有三種梯度下降的變體:

  • Vanilla 梯度下降:在 Vanilla 梯度下降(也稱作批梯度下降)中,在每個循環中計算整個訓練集的損失函數的梯度。該方法可能很慢並且難以處理非常大的數據集。該方法能保證收斂到凸損失函數的全局最小值,但對於非凸損失函數可能會穩定在局部極小值處。
  • 隨機梯度下降:在隨機梯度下降中,一次提供一個訓練樣本用於更新權重和偏置,從而使損失函數的梯度減小,然後再轉向下一個訓練樣本。整個過程重覆了若幹個循環。由於每次更新一次,所以它比 Vanilla 快,但由於頻繁更新,所以損失函數值的方差會比較大。
  • 小批量梯度下降:該方法結合了前兩者的優點,利用一批訓練樣本來更新參數。

優化器(optimizer)的作用

通過前面的介紹,我們可知人工神經網絡是由很多神經元組成的,每個神經元都有自己的權重w,表示在某項任務中,該神經元的重要程度。假設輸入數據為x,那麽預測值即為:

prediction = wx + b             # b 是偏置量

訓練的過程,其實就是計算合適的w和b的過程。那麽,什麽樣的w和b是“合適”的呢?答案就是預測值與真實值相差不大。例如定義損失函數:

loss = sum(|(y_ - prediction)|)

即,真實值減去預測值,取絕對值後求和。訓練的過程,可以粗略的理解成:調節 w 和 b, 使 loss 盡可能小。對w和b參數的調節,就是優化器(optimizer)需要做的,這就是優化器的作用。

上面這種 loss 的定義只是一種比較簡單的例子,當然有其他定義方式。例如cross_entropy(交叉熵),它是用來描述兩種分布的接近程度的,越接近,交叉熵越小。

tensorflow 有哪些優化器(optimizer)

Tensorflow 官方提供了 7 種優化器:

  • GradientDescentOptimizer
  • AdagradOptimizer
  • AdagradDAOptimizer
  • MomentumOptimizer
  • AdamOptimizer
  • FtrlOptimizer
  • RMSPropOptimize
    優化器的目的都是為了訓練網絡的,這 7 種優化器在對資源的需求上,和訓練速度上有些差異,因此需要根據實際情況選用。下圖是幾種優化器的訓練速度對比,能夠看出差異:在這次應用中, SGD 雖然路徑最短,但是速度卻很慢,其他幾種高階優化器,速度快很多。

下面介紹幾個常用的優化器的構造函數,構造函數告訴我們如何構建這些優化器。

  1. GradientDescentOptimizer
    這個就是最基礎的基於梯度下降法的優化器了。GradientDescentOptimizer 需要用到全部的樣本,速度比較慢,但是叠代到一定次數最終能夠找到最優解,GDO 有個別名 SGD?。建立時,構造函數為:
tf.train.GradientDescentOptimizer.__init__(learning_rate,
use_locking=False, name='GrandientDescent')

# learning_rate:學習率
# use_locking:用鎖
# name:名字
  1. MomentumOptimizer
    MomentumOptimizer 利用了上一次的調整量,因為它考慮了過去的值的影響,有點像物理學中的小球運動會受到之前動量的影響,所以被稱為Momentum(動量)優化器。如果上一次梯度顯示是正方向,這次也是正方向,那麽這次的調整量將加上一定的幅度。如果上次和這次的梯度方向相反,則削減變動幅度,使之更加平穩和快速的往最小點移動。MomentumOptimizer 的構造函數如下:
tf.train.MomentumOptimizer.__init__(learning_rate, momentum,
use_locking=False, name='Momentum', use_nesterov=False)

# momentum: 動量,可以是一個張量,也可以是一個浮點數值
  1. AdamOptimizer
    AdamOptimizer 結合了 MomentumOptimizer 和 RMSPropOptimize,利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。它對學習率有個約束,使得每一次學習率都有個確定範圍,因此參數比較平穩。構造函數如下:
tf.train.AdamOptimizer.__init__(learning_rate=0.001, beta1=0.9,
beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')

# beta1, beta2:對第一和第二動量估計的指數衰減率,可以是張量,也可是是浮點數值。
# epsilon:非常小的常量。

上一篇
Tensorflow 損失函數(loss function)
下一篇
Tensorflow實現線性迴歸
系列文
30天鍊成機器學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言